iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
1
  1. function fn(){... reutrn ..;}
  2. var fn_1 = function {... reutrn ..;}

使用(2)方式,因為hoisted的關係,var fn_1會往上提昇,但給定的function{..}還是在原處。所以如果在這之前呼叫function會參考不到而發生錯誤。使用(1)的方式是整個hoisted,也應為提昇的關係可以在原處之前呼叫也沒有問題。

若function裡無return值,則function執行完畢回覆給呼叫者會是undefined。

定義function可出現在程式碼的任何地方,但不能出現在迴圈裡(for,while,...)。

調用函式

方法有四種

  • 作為函式(function)
  • 作為方法(method)
  • 作為建構式(constructors)
  • 透過call/apply

做為函式 function

function test(v){...}

test(1);
var t = test(5);

做為方法 method

物件(object)裡的property中的函式。

var obj={x:1}
obj.fn= function(){...}

ojb.fn(); // invoke fn

var obj={
x:1,
y:2,
add: function(){
        this.result= this.x + this.y;
    }
}

obj.add(); // obj["add"]()
obj.result; // return 3
  • 函式主體使用this來參考這個物件。
  • 執行完obj.add() 物件本身會多一個result的property。

this關鍵字:
如果是物件裡方法(method)中使用,則作用域會是物件內部。
如果是在函示(function)直接使用則this指向的是global(非strict)或undefined(strict)

var x= 5;
function fn_1(){
    return this.x; // 指的是global的x
}

var obj={
x:2,
obj_fn: function(){
        return this.x; // 指的是obj裡的x
    }
}

fn_1(); // 5
obj.obj_fn; // 2

作為建構式

如果在使用function或method前面加上了new,那就構成了invoke建構式。通常不使用return關鍵字。

var obj = new Object();
var obj = new Object; // 若無參數傳入最後的()可省略。
  • 建構式會創建一個新的空object,且是繼承自constructor的prototype屬性

call / apply

會在Day9詳述。

function 引數與參數

在Javascript裡,並不會對傳入的參數作任何型別的檢查。
function fn(參數){}
fn(引數)

選擇性參數

選擇性參數需放在function帶入參數的最後。
當呼叫者傳入的引數少於function參數的數量,額外的部分會被設為undefined。

function fn(v1,v2){
    if(v2 === undefined) v2 =[];
    for(var p in v1){
        v2.push(p);
    }
    return v2;
}

arguments物件

當呼叫者傳入的引數多餘function參數,在function無法參告到這些不具名的值(直接忽略),arguments物件可以解決這個問題。

function fn(x,y,z){
    if(arguments.length != 3) {
        return thorw Error("Argumets length Error")
    }
}

fn(1,2,3,4)
  • arguments[0]取到的值與x是一樣的。
  • auguments[3]值為4。
function max(){
    var max = Number.NEGATIVE_INFINITY;
    for(var i=0; i < arguments.length; i++){
        if(arguments[i] > max) max = arguments[i];
    }
    return max
}
// 取最大值
max(1,10,5,255,1000) // return 1000

arguments並非真的陣列,是種類陣列物件(array-line object),可想像成具有編號的陣列元素且有length方法。
ES5 strict下,arguments不能使用。

callee / caller

在非strict下,Arguments物件使用callee特性可以取得目前正在執行的function,使用caller可查看call stack

定義自己的函式property

有些情況我們需要存取上次計算的值帶入fuction,大部分的情況會使用global變數存取。這有另一方式,直接存取在function的property中。

global 變數

var value=0;

function sum(n){
    value += n;
}

sum(5); // value= 5
sum(2); // value= 7

存取在function的property中

function sum(n){
    sum.value += n
}
sum.value = 0 ; // 初始化

sum(5);
sum(2); // sum.value=7 ,sum["value"]=7

  • 由上圖可以看出,"value" 是sum的property。

上一篇
Day 7: 陣列 Array
下一篇
Day 9: 函數 function (Part 2)
系列文
Javascript 犀牛本-濃縮再濃縮 提煉再提煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言